package com.example.algorithm.sort.select;

/**
 * @program: algorithm
 * @description: 选择排序
 * @packagename: com.example.algorithm.sort.select
 * @author: Jay
 * @date: 2022/03/24 16:07:03
 **/
public class Selection {


    /**
     * 最坏
     * 数据比较次数：n-1,n-2...2,1: N^2/2-N/2
     * 数据交换：N-1
     * 时间复杂度：O(N^2)
     * @param a
     */
    public static void sort(Comparable[] a){
        for (int i = 0; i <= a.length-2; i++) {
            //定义一个变量，记录最小元素的索引，默认参与选择排序的第一个所在的元素
            int minIndex = i;
            for (int j = i+1; j < a.length; j++){
                //比较最小索引minIndex处和j索引处的值
                if (greater(a[minIndex],a[j])){
                    minIndex = j;
                }
            }
            //交换最小元素所在minIndex的值和索引i的值
            exch(a,minIndex,i);
        }
    }

    /**
     * 比较a>b
     */
    public static boolean greater(Comparable a, Comparable b){
        return a.compareTo(b)>0;
    }

    /**
     * 数组元素i，j交换位置
     */
    private static void exch(Comparable[] a, int i, int j){
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
